

// 函数： 封装特定功能的代码块  复用  安全

//函数是一等公民

/* 
    1.函数定义类型
    我们可以给每个参数添加类型之后再为函数本身添加返回值类型。
    TypeScript 能够根据返回语句自动推断出返回值类型。
*/

// function add(x: number,y: number):number {
//     return x+y
// }

// let myAdd = function(x:number,y:number):number {
//     return x+y
// }

// console.log(add(1,2));
// console.log(myAdd(10,20));

// 完整写法
let myAdd2: (x:number,y:number)=>number = function(x:number,y:number):number {
    return x+y
}

console.log(myAdd2(100,200));


/* 
    2.可选参数和默认参数
    在 TypeScript 里我们可以在参数名旁使用 `?` 实现可选参数的功能
    默认参数：firstName:string="A"
    可选参数: lastName?:string
*/

function cName(firstName:string="A",lastName?:string):string {
    if (lastName) {
        return  firstName + ":" +lastName
    }else{
        return  firstName
    }
}


/* 
    3.函数剩余参数: 把所有参数收集到一个变量里：剩余参数会被当做个数不限的可选参数。 可以一个都没有，同样也可以有任意个
*/

function info(x:string,...args:string[]) {
    console.log(x,args);
    
}

info("a","b","c","d","abc","nba")

/* 
    4.函数重载
    函数重载: 函数名相同, 而形参不同的多个函数
    在 JS 中, 由于弱类型的特点和形参与实参可以不匹配, 是没有函数重载这一说的
    但在 TS 中, 与其它面向对象的语言(如 Java)就存在此语法
    需求: 我们有一个add函数，它可以接收2个string类型的参数进行拼接，也可以接收2个number类型的参数进行相加
*/

// 函数重载的声明
// function add(x:string,y:string): string {
//     return x+y
// }
// function add(x:number,y:number): number {
//     return x+y
// }

// 定义函数实现
function adds(x:number | string,y:number | string): number | string | undefined {
    if (typeof x === "string" && typeof y === "string") {
        return x+y
    }else if (typeof x === "number" && typeof y === "number") {
        return x+y
    }
}


console.log(adds(1,2));
console.log(adds("hello","world"));




